﻿Public Class ObjektNetzwerkMenü
    Inherits ObjektKartenauswahlMenü
    ''' <summary>
    ''' Unsere Lobby!
    ''' </summary>
    ''' <remarks></remarks>
    Public Lobby As BaseLobby
    ''' <summary>
    ''' Wird benutzt um den Button Weiter genau dann einmal zu erschaffen, wenn man sich neu verbindet.
    ''' </summary>
    ''' <remarks></remarks>
    Dim Beigetreten As Boolean = False

    Dim SpielInizialiesiert As Boolean = False
    Public Function IsSpielInizialiesiert() As Boolean
        Return SpielInizialiesiert
    End Function
    Public ErstesUpdateEmpfangen As Boolean = False

    Public Host As Boolean = False

    ''' <summary>
    ''' Says if we have received all Custom Stuff for this Game
    ''' </summary>
    ''' <remarks></remarks>
    Public CustomStuffReceieved As Boolean = False
    Public Sub New()
        MyBase.New(True)
        If My.Settings.Verhältnis = Hauptmenü.Breitbild Then
            Objektverwalter.LoadHintergrund(My.Settings.Resourcenpfad + "Hintergründe\MPHintergrundGroß.png")
        Else
            Objektverwalter.LoadHintergrund(My.Settings.Resourcenpfad + "Hintergründe\MPHintergrund.png")
        End If

        CreateNetzWerkLobby()

        IniLobby()
        
    End Sub
    ''' <summary>
    ''' Erstellt das Lobby Objekt sowie die Verbindung zur Lobby oder unsere Host Verbindung her!
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub CreateNetzWerkLobby()
        Lobby = New BaseLobby()
    End Sub

    Public Overrides Sub Frame()
        MyBase.Frame()
    End Sub

    Public Overrides Sub KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs)
        Select Case e.KeyCode
            Case Keys.W
                If KAModus <> KAModi.Lobby Then
                    btnWeiter()
                End If
            Case Keys.Z
                btnZurück()
            Case Else
                MyBase.KeyDown(sender, e)
        End Select
    End Sub

    Public Overrides Sub Malen()
        Select Case KAModus
            Case KAModi.Lobby
                Lobby.Malen()
        End Select
        MyBase.Malen()
    End Sub

    Public Overrides Sub MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
        MyBase.MouseMove(sender, e)
    End Sub

    Public Overrides Sub MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
        If Lobby.MouseDown(e) Then
            MyBase.MouseDown(sender, e)
        End If
    End Sub

    Public Overrides Sub MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
        Dim Funktion As String = checkMouseUPObjekte(e.X, e.Y)
        Select Case Funktion.ToLower
            Case "Erstellen".ToLower
                btnHosten()
            Case "Beitreten".ToLower
                btnBeitreten()
            Case "weiter"
                btnWeiter()
            Case "bereit"
                KAModus = KAModi.StartBereit
                ResetSpielerAuswahl()
                Hauptmenü.NetzBefehlSenden(Hauptmenü.NetzVorbereitungen.Bereit)

                LöschenButton("Bereit")
                LöschenButton("Zurück")
                NeuButton(Hauptmenü.MainMenü.MalPanel.Width - 138, Hauptmenü.MainMenü.MalPanel.Height - 30, My.Settings.Resourcenpfad + "Objekte\Button.png", "Abbrechen", New PointF(1, 1))
            Case "abbrechen"
                KAModus = KAModi.SpielerAuswahl
                SpielerAuswahlErstellen()
                Hauptmenü.NetzBefehlSenden(Hauptmenü.NetzVorbereitungen.NichtBereit)
                LöschenButton("Abbrechen")
                NeuButton(Hauptmenü.MainMenü.MalPanel.Width - 138, Hauptmenü.MainMenü.MalPanel.Height - 30, My.Settings.Resourcenpfad + "Objekte\Button.png", "Bereit", New PointF(1, 1))
                NeuButton(30, Hauptmenü.MainMenü.MalPanel.Height - 30, My.Settings.Resourcenpfad + "Objekte\Button.png", "Zurück", New PointF(0, 1))

            Case "zurück"
                btnZurück()
            Case "karte senden"
                Hauptmenü.NetzDatenKartentransfer()
            Case Else
                MyBase.MouseUp(sender, e)
        End Select
    End Sub
    Private Sub btnWeiter()
        If KAModus = KAModi.Lobby Then
            ResetLobby()
        End If
        If Hauptmenü.NetzConnected Then
            If Hauptmenü.NetzConnection.Players.Count >= 1 Then 'hier könnten wir eigentlich sagen mindestens 2 Spieler, ich bleib der einfachkeit halber bei mindestens einem(Sobald man ein Spiel erstellt hat, ist man ja der eine, wenn man beitritt, sind es sogar mindestens zwei. :)
                If Hauptmenü.NetzHosten Then
                    'Der Host hat alle Zugriffsrechte 
                    Weiter()
                    Select Case KAModus
                        Case KAModi.KartenAuswahl

                        Case KAModi.SpielerAuswahl

                        Case KAModi.RegelnFestlegen

                        Case KAModi.StartBereit
                            'Hauptmenü.NetzBefehlSenden(Hauptmenü.NetzVorbereitungen.Bereit)
                    End Select
                Else 'wir sind kein Host wir kommen zur Spieler auswahl
                    Select Case KAModus
                        Case KAModi.KartenAuswahl
                            While Not ErstesUpdateEmpfangen
                                Threading.Thread.Sleep(100)
                            End While
                            For I = 1 To KIStufen.Length - 1
                                If KIStufen(I) = ObjektSpieler.KIStufen.Offen Then
                                    KIStufen(I) = ObjektSpieler.KIStufen.Mensch
                                    'So dieser Spieler wird jetzt Passiv für die Anderen
                                    Hauptmenü.NetzBefehlKartenauswahlSendenKI(I, (CInt(ObjektSpieler.KIStufen.Passiv)).ToString)
                                    Exit For
                                ElseIf I = KIStufen.Length - 1 Then
                                    Hauptmenü.NetzLeaveGame("Zu viele Spieler")
                                End If
                            Next
                            Me.Regeln = New ObjektRegeln(KIStufen.Length - 1, False)
                            KAModus = KAModi.SpielerAuswahl
                            SpielerAuswahlErstellen()
                            Weiter()
                        Case KAModi.SpielerAuswahl
                            ' If Not SpielBereit() Then
                            '    LöschenButton("Weiter")
                            '    NeuButton(My.Settings.BildschirmBreite - 138, My.Settings.BildschirmHöhe - 30, My.Settings.Resourcenpfad + "Objekte\Button.png", "Bereit")
                            '    'KAModus = KAModi.StartBereit
                            '    'Hauptmenü.NetzBefehlSenden(Hauptmenü.NetzVorbereitungen.Bereit)
                            'Else
                            NextPlayer(1)
                            'End If
                    End Select
                End If
            End If
        ElseIf KAModus = KAModi.RegelnFestlegen Then
            Hosten()
            Weiter()
        End If
    End Sub
    Private Sub btnZurück()
        Select Case KAModus
            Case KAModi.Lobby
                Hauptmenü.Ini(Hauptmenü.Formmodi.Hauptmenü)
            Case KAModi.KartenAuswahl
                ResetKartenAuswahl()
                IniLobby()
            Case Else
                Zurück()
        End Select

    End Sub
    Public Sub btnHosten()
        'So wir wollen ein Spiel erstellen.
        'Eigentlich sind wir in der Lobby naja jetzt noch nicht.
        'wir sagen einfach weiter 
        Host = True

        'Ich gehe davon aus, das alles geklappt hat und man hier auf jeden Fall in ein Spiel verwickelt ist.
        LöschenButton("Beitreten")
        LöschenButton("Erstellen")

        NeuButton(Hauptmenü.MainMenü.MalPanel.Width - 138, Hauptmenü.MainMenü.MalPanel.Height - 30, My.Settings.Resourcenpfad + "Objekte\Button.png", "Weiter", New PointF(1, 1))
        Weiter()
    End Sub
    ''' <summary>
    ''' Jetzt wird das Spiel erstellt
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub Hosten()
        If Not Hauptmenü.NetzConnected Then
            Hauptmenü.NetzIni(True)
            If Hauptmenü.NetzConnected Then
                Lobby.GameStarted()
            End If
        End If
    End Sub
    Sub btnBeitreten()
        If Not Hauptmenü.NetzConnected Then
            If BaseLobby.CurrentGame IsNot Nothing Then
                If BaseLobby.CurrentGame.Version = My.Application.Info.Version Then
                    If BaseLobby.CurrentGame.CurrentPlayers < BaseLobby.CurrentGame.MaxPlayers Then
                        Dim HostAdress As New Microsoft.DirectX.DirectPlay.Address(BaseLobby.CurrentGame.HostAdress)
                        Hauptmenü.NetzIni(HostAdress)
                    End If
                End If
            Else
                Hauptmenü.NetzIni(False)
            End If
            'wir sind beigetreten 
        Else

        End If
    End Sub

    Public Overrides Sub MouseWheel(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
        MyBase.MouseWheel(sender, e)
    End Sub

    Public Overrides Sub SetMausBild()

    End Sub

    Public Overrides Sub IniMenü()
        MyBase.IniMenü()
    End Sub

    Public Overrides Sub SprachEingabe(ByVal Eingabe As String)
        Select Case Eingabe.ToLower
            Case "weiter"
                btnWeiter()
            Case "zurück"
                btnZurück()
            Case "erstellen"
                btnHosten()
            Case "beitreten"
                btnBeitreten()
            Case Else
                MyBase.SprachEingabe(Eingabe)
        End Select
    End Sub
    Public Sub PrüfenWeiter()
        If Beigetreten Then Exit Sub
        LöschenButton("Beitreten")
        LöschenButton("Erstellen")
        NeuButton(Hauptmenü.MainMenü.MalPanel.Width - 138, Hauptmenü.MainMenü.MalPanel.Height - 30, My.Settings.Resourcenpfad + "Objekte\Button.png", "Weiter", New PointF(1, 1))
        If Hauptmenü.NetzHosten Then NeuButton(Hauptmenü.MainMenü.MalPanel.Width - 138, 10, My.Settings.Resourcenpfad + "Objekte\Button.png", "Karte senden", New PointF(1, 0))
        Beigetreten = True
    End Sub

    Public Sub Spielstartprüfen()
        If Hauptmenü.NetzTeilnehmer.Length <= 1 Then Exit Sub
        Dim Startbereit As Boolean = True
        For Each T In Hauptmenü.NetzTeilnehmer
            If Not T.Bereit Then Startbereit = False
        Next
        If Startbereit Then
            'We don't want to be shown anymore!
            BaseLobby.ListenForAnswers = False
            'Es sieht so aus, als ob wir starten können :)
            VorSpielstart() 'Noch ein paar letzte endgültige Änderungen und dann...
            Spielstart() '...Starten!
        End If
    End Sub

    Public Sub VorSpielstart()
        If Hauptmenü.NetzHosten Then
            'HOST:
            'Die Regeln an unsere Mitspieler senden.
            Hauptmenü.NetzBefehlKartenauswahlSendenRegeln(Regeln)
        Else
            'CLIENT:
            For I = 0 To KIStufen.Length - 1 'Beim Clienten gibt's nur 2 Möglichkeiten. Entweder der Menschliche User steuert, oder es wird von einem anderen Computer aus gesteuert.
                If Not KIStufen(I) = ObjektSpieler.KIStufen.Mensch Then KIStufen(I) = ObjektSpieler.KIStufen.Passiv
            Next
        End If
    End Sub

    Protected Sub IniLobby()
        KAModus = KAModi.Lobby
        CustomStuffReceieved = False
        ResetButton()
        NeuButton(30, Hauptmenü.MainMenü.MalPanel.Height - 30, My.Settings.Resourcenpfad + "Objekte\Button.png", "Zurück", New PointF(0, 1))
        'Weiter ist erst zu sehen, sobald Man entweder Hostet oder einem Spiel Beigetreten ist.
        NeuButton(Hauptmenü.MainMenü.MalPanel.Width - 138, Hauptmenü.MainMenü.MalPanel.Height - 77, My.Settings.Resourcenpfad + "Objekte\Button.png", "Beitreten", New PointF(1, 1))
        NeuButton(Hauptmenü.MainMenü.MalPanel.Width - 138, Hauptmenü.MainMenü.MalPanel.Height - 30, My.Settings.Resourcenpfad + "Objekte\Button.png", "Erstellen", New PointF(1, 1))

    End Sub
    Protected Sub ResetLobby()
        ResetButton()

    End Sub

    Public Sub SetKIStufe(ByVal Spieler As Integer, ByVal KIStufe As ObjektSpieler.KIStufen)
        If Hauptmenü.NetzConnected Then
            If Hauptmenü.NetzHosten Then
                'wir sind Host
                'Das heißt es kann nur ein offener Platz verändert worden sein
                KIStufen(Spieler) = KIStufe
            Else
                'wir sind ein Client
                'Aha das ist momentan ein Mensch.
                If KIStufen(Spieler) = ObjektSpieler.KIStufen.Mensch Then
                    KIStufen(Spieler) = KIStufe
                    If ErstesUpdateEmpfangen Then
                        For I = 1 To KIStufen.Length - 1
                            If KIStufen(I) = ObjektSpieler.KIStufen.Offen Then
                                KIStufen(I) = ObjektSpieler.KIStufen.Mensch
                                Exit For
                            ElseIf KIStufen(I) = ObjektSpieler.KIStufen.Mensch Then
                                'Wir sind bereits ein Mensch warum überschreiben mit Mensch?
                                Exit For
                            ElseIf I = KIStufen.Length - 1 Then
                                Hauptmenü.NetzLeaveGame("Zu viele Spieler!")
                            End If
                        Next
                    End If
                Else
                    KIStufen(Spieler) = KIStufe
                End If
            End If
            'Jetzt noch alles Updaten
            For I = 0 To Spielerdaten.Length - 1
                If KIStufen(I + 1) = ObjektSpieler.KIStufen.Passiv Then
                    '  Spielerdaten(I).SetKIstufe(Sprachconverter.Translate("Mensch") + " ")
                    Spielerdaten(I).SetKIstufe(KIStufen(I + 1).ToString)
                Else
                    Spielerdaten(I).SetKIstufe(KIStufen(I + 1).ToString)
                End If
            Next
            If DropDownMenüs.Length > 0 Then
                If Not DropDownMenüs(0) Is Nothing Then
                    DropDownMenüs(0).SetItems(GetSpielerItems)
                End If
            End If
        End If
    End Sub

    Public Sub SetBauliste(ByVal Spieler As Integer, ByVal Bauliste As ObjektKartenauswahlMenü.KartenAuswahlBaulisten)
        If Spieler < 1 Then
            For I = 0 To Spielerdaten.Length - 1
                Spielerdaten(I).ChangeBauliste(Bauliste, Me)
            Next
        Else
            If Spielerdaten.Length >= Spieler Then
                Spielerdaten(Spieler - 1).ChangeBauliste(Bauliste, Me)
            End If
        End If
    End Sub

    Public Function KarteFestlegenHashcode(ByVal Hash As Integer) As Boolean
        For I = 0 To Kartenname.Length - 1
            If Hash = My.Computer.FileSystem.ReadAllText(Kartenname(I), System.Text.Encoding.UTF8).GetHashCode Then
                KarteFestlegenAn(I)
                Return True
            End If
        Next
        Return False
    End Function
    Public Sub KarteFestlegenAn(ByVal Stelle As Integer)
        SpielInizialiesiert = True
        FestlegenDerKarte(Stelle)

        SpielerAuswahlErstellen()

        Dim T As New Threading.Thread(AddressOf btnWeiter)
        T.Name = "Weiter"
        T.Start()
    End Sub
    Public Overrides Sub Reset()
        Lobby.ExitLobby()
        MyBase.Reset()
    End Sub
End Class
